package controller.midlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.Map;
import java.util.StringTokenizer;

import javax.ejb.EJB;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Cliente;
import model.OrdemServico;
import model.Usuario;
import dao.OrdemServicoDAOLocal;
import dto.OrdemServicoDTO;
import enumtype.StatusOrdemServico;
import facade.NaoTemParaBaixarException;
import facade.OsMoveisException;

/*
 1- resposta servidor
 2- resposta cel
 3- nova os
 4- os alterada
 5- Nenhuma OS
 6- os reposit�rio
 7- Acesso negado.
 */
public class MidletFrontController extends HttpServlet implements Servlet {

	private static final long serialVersionUID = -3946066062573960205L;

	@EJB
	OrdemServicoDAOLocal osDao;

	@SuppressWarnings("unchecked")
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		BufferedReader br = req.getReader();
		String dados = br.readLine();
		System.out.println("Recebi a String: " + dados);
		// Decompoe a String e a coloca em um vetor de Strings
		// Dessa forma, posso pegar uma posição específica do array
		StringTokenizer st = new StringTokenizer(dados, ";");
		String[] arrayDados = new String[st.countTokens()];
		int i = 0;
		while (st.hasMoreTokens()) {
			String valor = st.nextToken();
			System.out.println(valor);
			arrayDados[i] = valor;
			i++;
		}
		OrdemServicoDTO osdto = null;
		try {
			osdto = OrdemServicoBuilder.create(arrayDados);
		} catch (OsMoveisException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		// Autentica��o do usuario do celular
		Map<String, Usuario> usuarios = (Map<String, Usuario>) getServletContext()
				.getAttribute("usuariosMidlet");
		boolean autenticou = AutenticadorMidlet.autenticaUsuario(osdto.getUsuario(), osdto.getSenha(), usuarios);
		if (!autenticou) {
			resp.getWriter().print("7");
			return;
		}

		switch (osdto.getCodigoObjeto()) {
		case 2:
			System.out.println("recebido resposta do cel");
			// v.remove(0);
			break;
		case 3:
			System.out.println("tres");
			// Buscar se tem Oss pra baixar
			OrdemServico os;
			try {
				os = osDao.findOSParaBaixar();
				StringBuilder tripaOs = new StringBuilder("6");
				tripaOs.append(";");
				tripaOs.append(os.getId());
				tripaOs.append(";");
				Cliente c = os.getCliente();
				tripaOs.append(c.getNome());
				tripaOs.append(";");
				tripaOs.append(c.getDdd());
				tripaOs.append(c.getTelefone());
				tripaOs.append(";");
				tripaOs.append(c.getEndereco());
				tripaOs.append(";");
				tripaOs.append(c.getBairro());
				tripaOs.append(";");
				tripaOs.append(os.getDescricaoProblema());
				resp.getWriter().print(tripaOs.toString());
			} catch (NaoTemParaBaixarException e) {
				resp.getWriter().print("5");

			}
			break;
		case 4:
			System.out.println("Iniciando Atualizacao");
			osDao.atualizaStatus(osdto.getNumOs(), osdto.getDescrServico(),
					StatusOrdemServico.fromCode(osdto.getStatus()));
			System.out.println("Dados Recebidos:" + dados);
			System.out.println("Descr	 -	  Quantidade");
			if (osdto.getMateriais() != null) {
				for (String mat : osdto.getMateriais()) {
					System.out.println(mat);
				}
			}

			resp.getWriter().print("1");
		}

		resp.flushBuffer();
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.getWriter().write("oi");
	}

}
